using System;
using System.Data;
using System.Globalization;

namespace SistemaLib.sipe.util.io
{
	public enum FormatosFechas
	{
		Fecha, FechaHora
	}

	public enum TipoArchivoExportadorDataset
	{
		CVS, TXT
	}

	public class ExportadorDataSetColumna
	{
		public string NombreOriginal = "";
		public string NombreExportado = "";

		public ExportadorDataSetColumna( string nombreOriginal, string nombreExportado)
		{
			this.NombreOriginal = nombreOriginal;
			this.NombreExportado = nombreExportado;
		}

	}


	public class ExportadorDataSet
	{
		DataSet[] _ds;
		string _camino;
		ExportadorDataSetColumna[] _columnas;
		EscribidorDeArchivos _archi;
		bool _noCerrar = false;
		FormatosFechas _formatoFecha = FormatosFechas.Fecha;
		string _cabecera = "";
		TipoArchivoExportadorDataset _tipo;

		public ExportadorDataSet()
		{
			
		}

		public ExportadorDataSet( DataSet ds, string camino)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
			this.Camino = camino;
		}

		public ExportadorDataSet( DataSet ds, EscribidorDeArchivos archi, bool noCerrar)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
			this._archi = archi;
			this._noCerrar = noCerrar;
		}

		public ExportadorDataSet( DataSet ds, string camino, string[] columnas)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
			this.Camino = camino;
			this._columnas = new ExportadorDataSetColumna[ columnas.Length];
			for( int i = 0; i < columnas.Length; i++)
				this._columnas[i] = new ExportadorDataSetColumna( columnas[i], "");
				
		}

		public ExportadorDataSet( DataSet ds, string camino, ExportadorDataSetColumna[] columnas)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
			this.Camino = camino;
			this._columnas = columnas;
		}

		public ExportadorDataSet( DataSet ds, EscribidorDeArchivos archi, string[] columnas, bool noCerrar)
		{
			this.DatosOrigen = new DataSet[1];
			this.DatosOrigen[0] = ds;
			this._archi = archi;
			this._noCerrar = noCerrar;
			this._columnas = new ExportadorDataSetColumna[ columnas.Length];
			for( int i = 0; i < columnas.Length; i++)
				this._columnas[i] = new ExportadorDataSetColumna( columnas[i], "");
		}

		public ExportadorDataSet( DataSet[] dss, string camino)
		{
			this.DatosOrigen = dss;
			this.Camino = camino;
		}

		public ExportadorDataSet( DataSet[] dss, EscribidorDeArchivos archi, bool noCerrar)
		{
			this.DatosOrigen = dss;
			this._archi = archi;
			this._noCerrar = noCerrar;
		}

		public DataSet[] DatosOrigen
		{
			get
			{ return _ds; }
			set
			{ _ds = value; }
		}

		public string Camino
		{
			get
			{ return _camino; }
			set
			{ _camino = value; }
		}

		public FormatosFechas FormatoFechas
		{
			set
			{ _formatoFecha = value; }
		}

		public bool NoCerrar
		{
			get
			{ return _noCerrar; }
			set
			{ _noCerrar = value; }
		}

		public string Cabecera
		{
			set
			{
				this._cabecera = value;
			}
		}

		public TipoArchivoExportadorDataset Tipo
		{
			set
			{
				_tipo = value;
			}
		}

		public void Exportar()
		{
			if ( _archi == null )
			{
				_archi = new EscribidorDeArchivos( this.Camino);
				_archi.Abrir();
			}

			if ( _tipo == TipoArchivoExportadorDataset.TXT )
			{
				_archi.Separador = Convert.ToChar(9);
				_archi.EscapearEnter = true;
			}

			if ( _tipo == TipoArchivoExportadorDataset.CVS )
			{
				_archi.Separador = ';';
				_archi.EscapearEnter = true;
			}

			try
			{
				if ( this._cabecera != "" )
				{
					_archi.ImprimirColumna( this._cabecera);
					_archi.ImprimirFinLinea();
				}

				for ( int idx = 0; idx < _ds.Length; idx++)
				{

					DataTable tabla = _ds[idx].Tables[0];

					if ( _columnas == null )
					{
						// Imprimo cabecera
						for( int i = 0; i < tabla.Columns.Count; i++)
						{
							string nombre = tabla.Columns[i].Caption;
							_archi.ImprimirColumna( nombre);
						}
						_archi.ImprimirFinLinea();

						// Imprimo las lineas
						for( int j = 0; j < tabla.Rows.Count; j++)
						{
							for( int i = 0; i < tabla.Columns.Count; i++)
							{
								string valor;
								System.Type tipo = tabla.Rows[j][i].GetType();
								if ( tipo.Name == "String" )
								{
									valor = "\"" + tabla.Rows[j][i].ToString() + "\"";
								}
								else if ( tipo.Name == "DateTime"  )
								{
									string formato = "";
									if ( _formatoFecha == FormatosFechas.Fecha )
										formato = "dd/MM/yyyy";
									else
										formato = "dd/MM/yyyy HH:mm";
									
									//CultureInfo ci = new CultureInfo( );
									valor = DateTime.Parse( tabla.Rows[j][i].ToString()).ToString( formato);

								} 
								else if ( tipo.Name == "Decimal" )
								{
									try 
									{
										valor = Func.DecimalToCadena( (decimal)tabla.Rows[j][i]);
									} 
									catch ( Exception )
									{ valor = tabla.Rows[j][i].ToString() ; }
								}
								else
								{
									valor = tabla.Rows[j][i].ToString();
								}
								_archi.ImprimirColumna( valor);
							}
							_archi.ImprimirFinLinea();
						}
					}
					else
					{
						// Imprimo cabecera
						for( int i = 0; i < _columnas.Length; i++)
						{
							string nombre = "";
							if ( _columnas[i].NombreExportado == "" )
								nombre = tabla.Columns[_columnas[i].NombreOriginal].Caption;
							else
								nombre = _columnas[i].NombreExportado;
							_archi.ImprimirColumna( nombre);
						}
						_archi.ImprimirFinLinea();

						// Imprimo las lineas
						for( int j = 0; j < tabla.Rows.Count; j++)
						{
							for( int i = 0; i < _columnas.Length; i++)
							{
								string valor;
								System.Type tipo = tabla.Rows[j][_columnas[i].NombreOriginal].GetType();
								if ( tipo.Name == "String" )
								{
									valor = "\"" + tabla.Rows[j][_columnas[i].NombreOriginal].ToString() + "\"";
								}
								else if ( tipo.Name == "DateTime"  )
								{
									//CultureInfo ci = new CultureInfo( "es-AR");
									string formato = "";
									if ( _formatoFecha == FormatosFechas.Fecha )
										formato = "dd/MM/yyyy";
									else
										formato = "dd/MM/yyyy HH:mm";
										
									valor = DateTime.Parse( tabla.Rows[j][_columnas[i].NombreOriginal].ToString()).ToString( formato);
								}  
								else if ( tipo.Name == "Decimal" )
								{
									try 
									{
										valor = Func.DecimalToCadena( (decimal)tabla.Rows[j][_columnas[i].NombreOriginal]);
									} 
									catch ( Exception )
									{ valor = tabla.Rows[j][i].ToString() ; }
								}
								else
								{
									valor = tabla.Rows[j][_columnas[i].NombreOriginal].ToString();
								}
								_archi.ImprimirColumna( valor);
							}
							_archi.ImprimirFinLinea();
						}
					}

				}
			
			}
			finally
			{
				if ( ! _noCerrar )
				{
					_archi.Cerrar();
				}
			}

		}

	}
}

